"""
获取每日行业的净收入
f43：最新价 f44：最高 f45：最低 f46:今开 f47：总手数 f48：成交金额 f49：外盘
f50：量比 f51：涨停 f52：跌停 f55：收益  f58：股票名称 f60：昨收 f71:均价
f84:总股本 f85：流通股本 f92:每股净资产 f105:归属净利润 f116:总市值 f117：流通市值
f127：概念板块 f128：地域板块 f135:主力流入 f136:主力流出 f137:主力净流入 f138:超大单流入 f139:超大单流出
f140：净超大单 f141:大单净流入 f142:大单净流出 f143净大单 f144 中单净流入 f145: 中单净流出
f146:净中单 f147:小单净流入 f148：小单净流出 f149:净小单 f161：内盘 f162:动态市盈率 f163:静态市盈率
f164:ttm市盈率 f167：市净率 f168：换手率 f169:涨跌额 f170：涨幅 f173:净资产收益率
f183:营业总收入 f184:营业总收入同比增长 f185：归属净利润同比增长 f186:毛利率
f187:净利率 f188:负债率 f189：上市日期 f190: 每股未分配利润  f191:委比
f192:尾差 f31:卖5价格 f32:卖5手数 f33:卖4价格 f34:卖4手数 f35:卖3价格 f36:卖3手数
f37:卖2价格 f38:卖2手数 f39:卖1价格 f40:卖1手数 f19:买1价格 f20:买1手数
f17:买2价格 f18:买2手数 f15:买3价格 f16:买3手数 f13:买4价格 f14:买4手数
f11:买5价格 f12:买5手数
"""
import sys
sys.path.append("../")
import json

from frameworks.utils.RedisUtil import *
from model.StockBaseInfo import *
from prettytable import PrettyTable

redis = RedisUtil()
ck = "select_stock_cache"
rs = json.loads(redis.vget(ck))
allstockdata = {}
stock_codes = []
for option in rs:
    allstockdata[option["f57"]+"("+ option["f58"] +")"] = option
    stock_codes.append(option["f57"]+"("+ option["f58"] +")")

# 模拟股票数据，这里使用 DataFrame 存储
stock_data = {
    '归属净利润': [],  # 归属净利润
    '营业总收入': [],  # 营业总收入
    '净资产收益率': [],  # 净资产收益率
    '动态市盈率': [],  # 动态市盈率
    '市净率': [],  # 市净率
    '负债率': [],  # 负债率
    '每股净资产': [],  # 每股净资产
    '总市值': [],  # 总市值
    '换手率': [],  # 换手率
}

for code in stock_codes:
    stock_data["归属净利润"].append(round(float(allstockdata[code]["f105"])/100000000,2))
    stock_data["营业总收入"].append(round(float(allstockdata[code]["f183"])/100000000,2))
    stock_data["净资产收益率"].append(round(float(allstockdata[code]["f173"]),2))
    stock_data["动态市盈率"].append(round(float(allstockdata[code]["f162"]),2))
    stock_data["市净率"].append(round(float(allstockdata[code]["f167"]),2))
    stock_data["负债率"].append(round(float(allstockdata[code]["f188"]),2))
    stock_data["每股净资产"].append(round(float(allstockdata[code]["f92"]),2))
    stock_data["总市值"].append(round(float(allstockdata[code]["f116"])/100000000,2))
    stock_data["换手率"].append(round(float(allstockdata[code]["f168"]),2))

df = pd.DataFrame(stock_data)
df['股票代码'] = stock_codes

# 定义各指标的权重，可根据实际情况调整
weights = {
    '归属净利润': 0.2,
    '营业总收入': 0.15,
    '净资产收益率': 0.2,
    '动态市盈率': -0.1,  # 市盈率越低越好，权重为负
    '市净率': -0.1,  # 市净率越低越好，权重为负
    '负债率': -0.1,  # 负债率越低越好，权重为负
    '每股净资产': 0.1,
    '总市值': 0.1,
    '换手率': 0.05
}


# 数据标准化函数
def standardize(df):
    return (df - df.min()) / (df.max() - df.min())


# 标准化各指标数据
standardized_df = standardize(df.drop('股票代码', axis=1))

# 计算综合得分
df['综合得分'] = 0
for col, weight in weights.items():
    df['综合得分'] += standardized_df[col] * weight
df['综合得分'] = df['综合得分'].round(4)

# 根据综合得分进行排序
sorted_df = df.sort_values(by='综合得分', ascending=False)

# 使用 PrettyTable 输出排序后的股票数据
table = PrettyTable()
table.field_names = ['股票代码', '综合得分'] + list(stock_data.keys())
for _, row in sorted_df.iterrows():
    table.add_row([row['股票代码'], row['综合得分']] + [row[col] for col in stock_data.keys()])
print("排序后的股票数据：")
print(table)

# 分析各指标对排名的影响
print("\n各指标对排名的影响分析：")
for index, row in sorted_df.iterrows():
    sub_table = PrettyTable()
    sub_table.field_names = ['指标', '贡献得分', '权重']
    print(f"\n股票代码 {row['股票代码']} 综合得分: {row['综合得分']}")
    for col, weight in weights.items():
        score_contribution = standardized_df.loc[index, col] * weight
        sub_table.add_row([col, f"{score_contribution:.4f}", weight])
    print(sub_table)

# 找出各指标表现最好和最差的股票
best_worst_analysis = {}
for col in df.columns.drop(['综合得分', '股票代码']):
    best_stock = df.loc[df[col].idxmax(), '股票代码']
    worst_stock = df.loc[df[col].idxmin(), '股票代码']
    best_worst_analysis[col] = {
        'best': best_stock,
        'worst': worst_stock
    }

# 使用 PrettyTable 输出各指标表现最好和最差的股票分析
best_worst_table = PrettyTable()
best_worst_table.field_names = ['指标', '表现最好的股票代码', '表现最差的股票代码']
for col, info in best_worst_analysis.items():
    best_worst_table.add_row([col, info['best'], info['worst']])
print("\n各指标表现最好和最差的股票分析：")
print(best_worst_table)

# 分析综合得分最高和最低的股票的优势和劣势
top_stock = sorted_df.iloc[0]
bottom_stock = sorted_df.iloc[-1]

# 使用 PrettyTable 输出综合得分最高的股票优势和劣势分析
top_table = PrettyTable()
top_table.field_names = ['指标', '值']
print("\n综合得分最高的股票（代码: {}）优势和劣势分析：".format(top_stock['股票代码']))
for col in df.columns.drop(['综合得分', '股票代码']):
    top_table.add_row([col, top_stock[col]])
print(top_table)

# 使用 PrettyTable 输出综合得分最低的股票优势和劣势分析
bottom_table = PrettyTable()
bottom_table.field_names = ['指标', '值']
print("\n综合得分最低的股票（代码: {}）优势和劣势分析：".format(bottom_stock['股票代码']))
for col in df.columns.drop(['综合得分', '股票代码']):
    bottom_table.add_row([col, bottom_stock[col]])
print(bottom_table)
